home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 11
/
Cream of the Crop 11-1.iso
/
games
/
ted5.zip
/
TED5-2.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-16
|
44KB
|
2,185 lines
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// TED5-2 : Menu Item Routines
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
#include "ted5.h"
#pragma hdrstop
////////////////////////////////////////////////////
//
// Toggle the INFOBAR on and off
//
////////////////////////////////////////////////////
void Item_ToggleInfo(void)
{
infobaron^=1;
MouseHide();
InitDesktop(TED5MenuBar,0);
FigureScreenEdges();
if (ybase+screenh>mapheight && mapheight>screenh)
ybase--;
DrawMap();
DrawInfoBar();
MouseShow();
}
////////////////////////////////////////////////////
//
// Tile Select
//
////////////////////////////////////////////////////
btype SelTb[]={{" Tiles ",2,21,1},
{" Masked ",11,21,1},
{" Icons ",21,21,1},
{" Exit ",30,21,2}};
DialogDef SelTd={"",38,23,4,&SelTb[0],NULL};
void SelectTiles(int screen)
{
int exitok=0,which,i,numrows,numcols,b0,b1,redraw=0;
//
// if parameter passed, change the screen
//
if (screen)
whichscreen=screen-1;
if (PasteMode || SelectMode) // RE-BLIT MAP IF WE ARE ENTERING WHILE
redraw=1; // FLOATING AN IMAGE
PasteMode=SelectMode=0;
SelX1=SelX2=SelY1=SelY2=-1;
switch(videomode)
{
case CGA:
case EGA1:
case VGA:
SelTd.height=23;
for(i=0;i<4;i++)
SelTb[i].yoff=21;
break;
case EGA2:
SelTd.height=58;
for(i=0;i<4;i++)
SelTb[i].yoff=56;
}
DrawDialog(&SelTd,1);
DrawTileSelect(0,&numrows,&numcols);
selectcols=numcols; // VERY IMPORTANT TO PASTE-FROM-TILESELECT MODE
DrawCurrentTiles();
while(keydown[0x39]); // WAIT FOR SPACE-UP
do
{
which=CheckButtonsRet(&SelTd);
b0=MouseButton()&1;
b1=(MouseButton()>>1)&1;
if (which<0)
{
//
// GRAB CURRENT TILE FROM MATRIX
//
if (b0 || b1)
{
int mx,my;
MouseCoords(&mx,&my);
mx/=8;
if (mx>=left && mx<left+(numcols<<(tsize-1)) &&
my>=16 && my<=16+(numrows<<(2+tsize)))
{
int tile;
tile=((my-16)>>(tsize+2))*numcols+
((mx-left)>>(tsize-1));
if (SelectMode)
{
int thebase;
switch(whichscreen)
{
case TILES: thebase=tilebase/numcols; break;
case MASKED: thebase=tilembase/numcols;
}
if (b0)
{
sound(1000);
SelY1=((my-16)>>(tsize+2))+thebase;
SelX1=((mx-left)>>(tsize-1));
if (SelX2==-1 && SelY2==-1)
{
SelX2=SelX1;
SelY2=SelY1;
}
DrawTileSelect(0,&numrows,&numcols);
nosound();
}
else
if (b1)
{
sound(1000);
SelY2=((my-16)>>(tsize+2))+thebase;
SelX2=((mx-left)>>(tsize-1));
if (SelX1==-1 && SelY1==-1)
{
SelX1=SelX2;
SelY1=SelY2;
}
DrawTileSelect(0,&numrows,&numcols);
nosound();
}
}
else
{
switch(whichscreen)
{
case TILES:
if (XMSlookup[tile+tilebase]>=0)
whicht=tile+tilebase;
else
errsound();
break;
case MASKED:
whichtm=tile+tilembase+numcols*maxiconrows+tilenum;
if (XMSlookup[whichtm]==-1)
whichtm=tilenum;
break;
case ICONS:
if (XMSlookup[tile+tilenum]>=0 || !tile)
whichi=tile+tilenum;
else
errsound();
break;
}
DrawCurrentTiles();
}
}
}
if (keydown[0x48]) // UP
DrawTileSelect(-1,&numrows,&numcols);
else
if (keydown[0x50]) // DOWN
DrawTileSelect(1,&numrows,&numcols);
else
if (keydown[0x47]) // HOME
{
if (whichscreen==TILES)
DrawTileSelect(-tilebase/numcols,&numrows,&numcols);
else
if (whichscreen==MASKED)
DrawTileSelect(-tilembase/numcols,&numrows,&numcols);
}
else
if (keydown[0x4f]) // END
{
if (whichscreen==TILES)
DrawTileSelect(tilenum,&numrows,&numcols);
else
if (whichscreen==MASKED)
DrawTileSelect(tilemnum,&numrows,&numcols);
}
else
if (keydown[0x49]) // PgUP
{
DrawTileSelect(-numrows,&numrows,&numcols);
if (!keydown[0x1d]) // if not CTRL down, wait for keyup
while(keydown[0x49]);
}
else
if (keydown[0x51]) // PgDN
{
DrawTileSelect(numrows,&numrows,&numcols);
if (!keydown[0x1d]) // if not CTRL down, wait for keyup
while(keydown[0x51]);
}
else
if (keydown[0x39]) // SPACEBAR
{
RestoreBackground();
while(keydown[0x39]);
SelectMode=0;
if (redraw)
DrawMap();
DrawInfoBar();
return;
}
else // 'C' TO COPY
if (keydown[0x2e] && (whichscreen==TILES || whichscreen==MASKED))
{
char temp[]="COPY MODE";
sx=screencenterx-strlen(temp)/2;
SelectMode=sy=1;
print(temp);
while(keydown[0x2e]);
}
}
else
switch(which)
{
case 0:
if (!SelectMode)
exitok=1;
else
{
char temp[]=" ";
sx=screencenterx-strlen(temp)/2;
SelectMode=0;
SelX1=SelX2=SelY1=SelY2=-1;
sy=1;
print(temp);
DrawTileSelect(0,&numrows,&numcols);
}
break;
case 4:
if (!SelectMode)
exitok=1;
//
// 'ENTER' TO FINALIZE COPY
//
else
{
char temp[]=" ";
if (MouseButton()) // IF CLICKED ON 'EXIT' WITH MOUSE
break;
sound(500);
sx=screencenterx-strlen(temp)/2;
PasteOK=sy=1;
print(temp);
TileCopy.x=SelX1;
TileCopy.y=SelY1;
TileCopy.w=SelX2-SelX1+1;
TileCopy.h=SelY2-SelY1+1;
TileCopy.MapOrTileSelect=(whichscreen==TILES)+2*(whichscreen==MASKED);
while(keydown[0x1c]);
nosound();
SelectMode=0;
SelX1=SelX2=SelY1=SelY2=-1;
DrawTileSelect(0,&numrows,&numcols);
}
break;
//
// NORMAL TILE SELECT
//
case 1:
if (whichscreen!=TILES)
{
SelX1=SelX2=SelY1=SelY2=-1;
SelectMode=0;
whichscreen=TILES;
DrawDialog(&SelTd,0);
DrawCurrentTiles();
DrawTileSelect(0,&numrows,&numcols);
}
else
errsound();
GetButtonXY(&SelTd,0,&sx,&sy);
MouseHide();
print(SelTb[0].text);
MouseShow();
break;
//
// MASKED TILE SELECT
//
case 2:
if (tilemnum && whichscreen!=MASKED)
{
SelX1=SelX2=SelY1=SelY2=-1;
SelectMode=0;
whichscreen=MASKED;
DrawDialog(&SelTd,0);
DrawCurrentTiles();
DrawTileSelect(0,&numrows,&numcols);
}
else
errsound();
GetButtonXY(&SelTd,1,&sx,&sy);
MouseHide();
print(SelTb[1].text);
MouseShow();
break;
//
// ICON SELECT
//
case 3:
if (tilemnum && whichscreen!=ICONS)
{
whichscreen=ICONS;
DrawDialog(&SelTd,0);
DrawCurrentTiles();
DrawTileSelect(0,&numrows,&numcols);
}
else
errsound();
GetButtonXY(&SelTd,2,&sx,&sy);
MouseHide();
print(SelTb[2].text);
MouseShow();
}
} while(!exitok);
RestoreBackground();
SelectMode=0;
SelX1=SelX2=SelY1=SelY2=-1;
DrawInfoBar();
if (redraw)
DrawMap();
}
//
// DRAW THE CURRENT TILES IN THE TILE-SELECT WINDOW
//
void DrawCurrentTiles(void)
{
MouseHide();
GetButtonXY(&SelTd,0,&sx,&sy);
sy-=1+tsize;
CombineTiles(whicht,0,0,tsize);
DrawTile(sx,sy*8,tsize);
sx+=2;
printhex(whicht);
sy++;
sx-=5;
printint(whicht);
print(" ");
if (tilemnum)
{
GetButtonXY(&SelTd,1,&sx,&sy);
sy-=1+tsize;
CombineTiles(-BkgndColor,whichtm,0,tsize);
DrawTile(sx,sy*8,tsize);
sx+=2;
(whichtm==tilenum)?print(" No "):printhex(whichtm-tilenum);
sy++;
sx-=5;
(whichtm==tilenum)?print(" Tile "):printint(whichtm-tilenum);
print(" ");
GetButtonXY(&SelTd,2,&sx,&sy);
sy-=1+tsize;
CombineTiles(-ICONBACK,whichi,0,tsize);
DrawTile(sx,sy*8,tsize);
sx+=2;
(whichi==tilenum)?print(" No "):printhex(whichi-tilenum);
sy++;
sx-=5;
(whichi==tilenum)?print(" Icon "):printint(whichi-tilenum);
print(" ");
}
MouseShow();
}
//
// CHECK TILESELECT EDGES
//
void CheckTSelectEdges(int x,int y,int basey)
{
int xx,yy,temp;
xx=left+(x<<(tsize-1));
yy=(y<<(tsize-1))+2;
if (SelX2<SelX1)
{
temp=SelX1;
SelX1=SelX2;
SelX2=temp;
}
if (SelY2<SelY1)
{
temp=SelY1;
SelY1=SelY2;
SelY2=temp;
}
if (x==SelX1 && y==SelY1-basey)
{
switch(tsize)
{
case 1: drawchar(xx,yy,1); return;
case 2: drawchar(xx ,yy,1);
drawchar(xx+1,yy,2);
drawchar(xx ,yy+1,4);
break;
case 3: drawchar(xx,yy,1);
drawchar(xx,yy+1,4);
drawchar(xx,yy+2,4);
drawchar(xx,yy+3,4);
drawchar(xx+1,yy,2);
drawchar(xx+2,yy,2);
drawchar(xx+3,yy,2);
break;
}
}
if (x==SelX2 && y==SelY2-basey)
{
switch(tsize)
{
case 1: drawchar(xx,yy,8); return;
case 2: drawchar(xx+1,yy+1,8);
drawchar(xx+1,yy,5);
drawchar(xx,yy+1,7);
break;
case 3: drawchar(xx+3,yy+3,8);
drawchar(xx+3,yy ,5);
drawchar(xx+3,yy+1,5);
drawchar(xx+3,yy+2,5);
drawchar(xx ,yy+3,7);
drawchar(xx+1,yy+3,7);
drawchar(xx+2,yy+3,7);
break;
}
}
if (x==SelX2 && y==SelY1-basey)
{
switch(tsize)
{
case 1: drawchar(xx,yy,3); return;
case 2: drawchar(xx+1,yy,3);
drawchar(xx,yy,2);
drawchar(xx+1,yy+1,5);
break;
case 3: drawchar(xx+3,yy,3);
drawchar(xx+2,yy,2);
drawchar(xx+1,yy,2);
drawchar(xx ,yy,2);
drawchar(xx+3,yy+1,5);
drawchar(xx+3,yy+2,5);
drawchar(xx+3,yy+3,5);
break;
}
}
if (x==SelX1 && y==SelY2-basey)
{
switch(tsize)
{
case 1: drawchar(xx,yy,6); return;
case 2: drawchar(xx,yy+1,6);
drawchar(xx+1,yy+1,7);
drawchar(xx,yy,4);
break;
case 3: drawchar(xx,yy+3,6);
drawchar(xx ,yy+2,4);
drawchar(xx ,yy+1,4);
drawchar(xx ,yy,4);
drawchar(xx+1,yy+3,7);
drawchar(xx+2,yy+3,7);
drawchar(xx+3,yy+3,7);
break;
}
}
if (x==SelX1 && y>SelY1-basey && y<SelY2-basey)
{
switch(tsize)
{
case 3: drawchar(xx,yy+3,4);
drawchar(xx,yy+2,4);
case 2: drawchar(xx,yy+1,4);
case 1: drawchar(xx,yy,4);
break;
}
}
else
if (y==SelY1-basey && x>SelX1 && x<SelX2)
{
switch(tsize)
{
case 3: drawchar(xx+3,yy,2);
drawchar(xx+2,yy,2);
case 2: drawchar(xx+1,yy,2);
case 1: drawchar(xx ,yy,2);
break;
}
}
else
if (x==SelX2 && y>SelY1-basey && y<SelY2-basey)
{
switch(tsize)
{
case 1: drawchar(xx,yy,5); return;
case 2: drawchar(xx+1,yy,5);
drawchar(xx+1,yy+1,5);
break;
case 3: drawchar(xx+3,yy,5);
drawchar(xx+3,yy+1,5);
drawchar(xx+3,yy+2,5);
drawchar(xx+3,yy+3,5);
break;
}
}
else
if (y==SelY2-basey && x>SelX1 && x<SelX2)
{
switch(tsize)
{
case 1: drawchar(xx,yy,7); return;
case 2: drawchar(xx ,yy+1,7);
drawchar(xx+1,yy+1,7);
break;
case 3: drawchar(xx ,yy+3,7);
drawchar(xx+1,yy+3,7);
drawchar(xx+2,yy+3,7);
drawchar(xx+3,yy+3,7);
break;
}
}
}
//
// FILL THE TILE SELECT SCREEN WITH TILES
//
void DrawTileSelect(int deltarow,int *retrows,int *retcols)
{
char tile[32*32];
int numcols,numrows,i,j;
MouseHide();
switch(videomode)
{
case CGA:
case EGA1:
case VGA:
numrows=18-10*(tsize==2)-15*(tsize==3);
left=2;
break;
case EGA2:
numrows=49-23*(tsize==2)-34*(tsize==3);
left=22;
}
switch(tsize)
{
case 1: numcols=36; break;
case 2: numcols=18; break;
case 3: numcols=9;
}
if (whichscreen==TILES && tilebase+numrows*numcols>tilenum)
{
tilebase=0;
numrows=tilenum/numcols;
}
if (whichscreen==MASKED && tilembase+numrows*numcols>tilemnum-maxiconrows*numcols)
{
tilembase=0;
numrows=tilemnum/numcols-maxiconrows;
}
if (whichscreen==ICONS && numrows*numcols>maxiconrows*numcols)
{
tilembase=0;
numrows=maxiconrows;
}
switch((deltarow<0?-1:deltarow>0?1:0))
{
case -1:
switch(whichscreen)
{
case TILES:
tilebase+=deltarow*numcols;
if (tilebase<0)
tilebase=0;
break;
case MASKED:
tilembase+=deltarow*numcols;
if (tilembase<0)
tilembase=0;
}
break;
case 1:
switch(whichscreen)
{
case TILES:
tilebase+=deltarow*numcols;
if (tilebase+numrows*numcols>tilenum)
tilebase=tilenum-numcols*numrows;
break;
case MASKED:
tilembase+=deltarow*numcols;
if (tilembase+numrows*numcols>tilemnum-maxiconrows*numcols)
tilembase=(tilemnum-maxiconrows*numcols)-numcols*numrows;
}
}
switch(whichscreen)
{
case TILES:
for(j=0;j<numrows;j++)
for(i=0;i<numcols;i++)
{
CombineTiles(tilebase+j*numcols+i,0,0,tsize);
if (GridMode)
Overlay(tsize);
DrawTile(i*2+left,j*16+16,tsize);
CheckTSelectEdges(i,j,tilebase/numcols);
}
break;
case MASKED:
for(j=0;j<numrows;j++)
for(i=0;i<numcols;i++)
{
CombineTiles(-BkgndColor,tilenum+numcols*maxiconrows+tilembase+j*numcols+i,0,tsize);
if (GridMode)
Overlay(tsize);
DrawTile(i*2+left,j*16+16,tsize);
CheckTSelectEdges(i,j,tilembase/numcols);
}
break;
default:
for(j=0;j<numrows;j++)
for(i=0;i<numcols;i++)
{
CombineTiles(-ICONBACK,tilenum+j*numcols+i,0,tsize);
if (GridMode)
Overlay(tsize);
DrawTile(i*2+left,j*16+16,tsize);
}
}
MouseShow();
*retrows=numrows;
*retcols=numcols;
}
void errsound(void)
{
sound(1000);
delay(50);
nosound();
}
////////////////////////////////////////////////////
//
// Item - About
//
////////////////////////////////////////////////////
void Item_About(void)
{
char dstr[200]=IDSTSTR;
strcat(dstr,"\n\n IdWare by John Romero\n");
strcat(dstr," ");
strcat(dstr,__DATE__);
strcat(dstr,"\n (C)1991 Id Software\n\n"
" DeluxePaint for Tile Maps! ");
ErrDialog(dstr," OK ");
}
////////////////////////////////////////////////////
//
// Item - Video Mode Switch
//
////////////////////////////////////////////////////
btype VMS1b[]={{" CGA 320x200 ",5,2,1},
{" EGA 320x200 ",5,5,1},
{" EGA 640x350 ",5,8,1},
{" VGA 320x200 ",5,11,1}};
DialogDef VMS1d={"Select the resolution:",22,14,4,&VMS1b[0],NULL};
void Item_ModeSwitch(void)
{
int i,which,rtn;
for(i=0;i<VMS1d.numbuttons;i++)
{
VMS1b[i].border=1;
if (i==lastvideo)
VMS1b[i].border=2;
}
// which=DoDialog(&VMS1d);
//
// Keep track of last video mode!
//
if (videomode==EGA1)
{
which=3;
lastvideo=videomode;
}
else
{
which=2;
lastvideo=videomode;
}
MouseHide();
switch(which)
{
case 0:
MouseShow();
return;
case 1:
if (!CgaXMS)
{
rtn=LoadGraphStuff(1,CGA);
if (!rtn)
{
MouseShow();
ErrDialog("There aren't any CGA\n"
"graphics files available!"," OK ");
return;
}
if (rtn<0)
return;
MouseShow();
}
else
{
xmshandle=CgaXMS;
XMSlookup=CgaXMSlookup;
}
setvideo(CGA);
break;
case 2:
if (!EgaXMS)
{
rtn=LoadGraphStuff(1,EGA1);
if (!rtn)
{
MouseShow();
ErrDialog("There aren't any EGA\n"
"graphics files available!"," OK ");
return;
}
if (rtn<0)
return;
MouseShow();
}
else
{
xmshandle=EgaXMS;
XMSlookup=EgaXMSlookup;
}
setvideo(EGA1);
break;
case 3:
if (!EgaXMS)
{
rtn=LoadGraphStuff(1,EGA1);
if (!rtn)
{
MouseShow();
ErrDialog("There aren't any EGA\n"
"graphics files available!"," OK ");
return;
}
if (rtn<0)
return;
MouseShow();
}
else
{
xmshandle=EgaXMS;
XMSlookup=EgaXMSlookup;
}
setvideo(EGA2);
break;
case 4:
if (!VgaXMS)
{
rtn=LoadGraphStuff(1,VGA);
if (!rtn)
{
MouseShow();
ErrDialog("There aren't any VGA\n"
"graphics files available!"," OK ");
return;
}
if (rtn<0)
return;
MouseShow();
}
else
{
xmshandle=VgaXMS;
XMSlookup=VgaXMSlookup;
}
setvideo(VGA);
}
InitDesktop(TED5MenuBar,0);
DrawInfoBar();
FigureScreenEdges();
if (xbase+screenw>mapwidth)
xbase=mapwidth-screenw;
if (mapwidth<screenw)
xbase=0;
if (ybase+screenh>mapheight)
ybase=mapheight-screenh;
if (mapheight<screenh)
ybase=0;
DrawMap();
MouseShow();
}
////////////////////////////////////////////////////
//
// Item - Map Stats
//
////////////////////////////////////////////////////
btype MapStatsb={" OK ",11,11,2};
DialogDef MapStatsd={" MAP STATS\n\n"
"Width :\n"
"Height :\n"
"Name :\n"
"Planes :",
24,13,1,&MapStatsb,NULL};
void Item_MapStats(void)
{
int ox,oy;
unsigned i,_seg *unique;
DrawDialog(&MapStatsd,1);
MouseHide();
GetDialogXY(&MapStatsd,&sx,&sy);
ox=sx+9;
oy=sy+2;
sx=ox;
sy=oy;
printint(mapwidth);
sx=ox;
sy=oy+1;
printint(mapheight);
sx=ox;
sy=oy+2;
print(MapHeader.name);
sx=ox;
sy=oy+3;
if (MapFileHeader->maptype&BPLANE)
print("BACK");
if (MapFileHeader->maptype&FPLANE)
print(",FORE");
if (MapFileHeader->maptype&IPLANE)
print(",INFO");
//
// Count amount of unique background tiles
//
sx=ox-9;
sy=oy+4;
if (MapFileHeader->maptype&BPLANE)
{
int amount=0;
print("Unique Bkgnd Tiles:");
MMAllocate((memptr *)&unique,tilenum*2);
_fmemset(unique,0,tilenum*2);
for (i=0;i<mapwidth*mapheight;i++)
unique[MapBkgnd[i]]=1;
for (i=0;i<tilenum;i++)
amount+=unique[i];
MMFreePtr((memptr *)&unique);
printint(amount);
}
//
// Count amount of unique foreground tiles
//
sx=ox-9;
sy=oy+5;
if (MapFileHeader->maptype&FPLANE)
{
int amount=0;
print("Unique Frgnd Tiles:");
MMAllocate((memptr *)&unique,tilemnum*2);
_fmemset(unique,0,tilemnum*2);
for (i=0;i<mapwidth*mapheight;i++)
if (MapFrgnd[i])
unique[MapFrgnd[i]]=1;
for (i=0;i<tilemnum;i++)
amount+=unique[i];
MMFreePtr((memptr *)&unique);
printint(amount);
}
//
// Count amount of icons
//
sx=ox-9;
sy=oy+6;
if (MapFileHeader->maptype&IPLANE)
{
int amount=0;
print("Amount of Icons:");
for (i=0;i<mapwidth*mapheight;i++)
if (MapInfoPl[i])
amount++;
printint(amount);
}
//
// Display amount of memory the map needs
//
sx=ox-9;
sy=oy+7;
{
long length=0;
if (MapFileHeader->maptype&BPLANE)
length+=2L*mapwidth*mapheight;
if (MapFileHeader->maptype&FPLANE)
length+=2L*mapwidth*mapheight;
if (MapFileHeader->maptype&IPLANE)
length+=2L*mapwidth*mapheight;
length+=sizeof(MapHeaderStr);
print("Size of map:");
length=(length+1023)/1024;
printint(length);
print("K");
}
MouseShow();
CheckButtons(&MapStatsd);
RestoreBackground();
}
////////////////////////////////////////////////////
//
// Item - Edit New Map
//
////////////////////////////////////////////////////
btype DOSAVEb[]={{" Yes ",3,3,2},
{" No! ",15,3,1}};
DialogDef DOSAVEd={"Your map has changed!\n"
" Save it?",
21,5,2,&DOSAVEb[0],NULL};
void Item_EditMap(void)
{
int which,olddirt;
olddirt=DirtyFlag;
if (DirtyFlag)
{
which=DoDialog(&DOSAVEd);
if (!which)
return;
if (which==1)
Item_SaveMap();
DirtyFlag=0;
}
if ((which=SelectMap(1,CREATED,"TO EDIT"))==-1)
{
DirtyFlag=olddirt;
return;
}
TEDInfo->level=whichmap=which;
LoadMap(whichmap);
MouseHide();
InitDesktop(TED5MenuBar,0);
DrawInfoBar();
FigureScreenEdges();
DrawMap();
MouseShow();
}
////////////////////////////////////////////////////
//
// Item - Save Map
//
////////////////////////////////////////////////////
void Item_SaveMap(void)
{
SaveMap(0);
DirtyFlag=0;
}
////////////////////////////////////////////////////
//
// Item - Create Map
//
////////////////////////////////////////////////////
void Item_CreateMap(void)
{
if (DirtyFlag)
{
int button;
button=DoDialog(&DoCreated);
if (!button)
return;
if (button==1)
Item_SaveMap();
DirtyFlag=0;
}
CreateMap(1);
MouseHide();
InitDesktop(TED5MenuBar,0);
DrawInfoBar();
FigureScreenEdges();
DrawMap();
MouseShow();
}
////////////////////////////////////////////////////
//
// Item - Delete Map
//
////////////////////////////////////////////////////
btype AreSureB[]={{" Yes ",1,4,1},
{" No ",11,4,2}};
DialogDef AreSureD={"Are you sure you\n"
"you want to delete",
18,6,2,&AreSureB[0],NULL};
void Item_DeleteMap(void)
{
MapHeaderStr TempHead;
int whichdel,which,temp;
if ((whichdel=SelectMap(1,CREATED,"TO DELETE"))==-1)
return;
if (whichmap==whichdel)
{
ErrDialog("I'm just not gonna stand for\n"
"you deleting the map you're\n"
"currently editing. I'm not\n"
"gonna doit. Nope."," Gee... ");
return;
}
LoadFile(mapname,(char huge *)&TempHead,
MapFileHeader->dataoffsets[whichdel],sizeof(MapHeaderStr));
MouseHide();
DrawDialog(&AreSureD,1);
GetDialogXY(&AreSureD,&sx,&sy);
sy+=2;
sx=screencenterx-(strlen(TempHead.name)+1)/2;
print(TempHead.name);
print("?");
MouseShow();
which=CheckButtons(&AreSureD);
switch(which)
{
case 1:
temp=whichmap;
whichmap=whichdel;
RestoreBackground();
SaveMap(1);
whichmap=temp;
return;
}
RestoreBackground();
}
////////////////////////////////////////////////////
//
// Item - Amputate Maps
//
////////////////////////////////////////////////////
void Item_Amputate(void)
{
char tstr[40];
MapHeaderStr TempHead;
int which1,which2,whichtemp,i,button;
long temp;
if ((which1 = SelectMap(1,CREATED,"TO START AMPUTATE"))==-1)
return;
LoadFile(mapname,(char huge *)&TempHead,
MapFileHeader->dataoffsets[which1],sizeof(MapHeaderStr));
if ((which2 = SelectMap(1,ANYLIST,"TO END AMPUTATE"))==-1)
return;
if (which2 < which1)
{
whichtemp = which1;
which1 = which2;
which2 = whichtemp;
}
if (whichmap >= which1 && whichmap <= which2)
{
ErrDialog ( "The currently loaded map\n"
"is within that range!\n"
"NON-AMPUTATENESS!!","Wah!");
return;
}
DrawDialog(&AreSureD,1);
button = CheckButtons(&AreSureD);
switch (button)
{
case 1:
for (i = which1;i <= which2;i++)
{
MapFileHeader->dataoffsets[i] = -1;
MapFileHeader->datalengths[i] = 0;
}
DirtyFlag = writeH = 1;
SaveMap(0);
}
}
////////////////////////////////////////////////////
//
// Item - Switch Maps
//
////////////////////////////////////////////////////
void Item_SwitchMap(void)
{
char tstr[40];
MapHeaderStr TempHead;
int which1,which2;
long temp;
while(1)
{
if ((which1=SelectMap(1,CREATED,"TO SWAP"))==-1)
return;
LoadFile(mapname,(char huge *)&TempHead,
MapFileHeader->dataoffsets[which1],sizeof(MapHeaderStr));
strcpy(tstr,"TO SWAP WITH '");
strcat(tstr,TempHead.name);
strcat(tstr,"'");
if ((which2=SelectMap(1,ANYLIST,tstr))==-1)
return;
if (which1==whichmap) // MAKE SURE THE CURRENTLY EDITED MAP GETS CHANGED!
whichmap=which2;
else
if (which2==whichmap)
whichmap=which1;
temp=MapFileHeader->dataoffsets[which1];
strcpy(tstr,MapNames[which1]);
strcpy(MapNames[which1],MapNames[which2]);
strcpy(MapNames[which2],tstr);
MapFileHeader->dataoffsets[which1]=MapFileHeader->dataoffsets[which2];
MapFileHeader->dataoffsets[which2]=temp;
writeH=DirtyFlag=1;
}
}
////////////////////////////////////////////////////
//
// Item - Quit
//
////////////////////////////////////////////////////
btype Qbuttons[]={{" Yes ",4,2,2},{" No ",12,2,1}},
DoSaveb[]={{" Yes ",7,4,2},{" No ",14,4,1}};
DialogDef Qdialog={"Quit - Are you sure?",20,4,2,&Qbuttons[0],NULL},
DoSaved={"The map has been modified.\n"
"Do you want to SAVE it\n"
"before exiting TED5?",26,6,2,&DoSaveb[0],NULL},
DoCreated={"The map has been modified.\n"
"Do you want to SAVE it\n"
"before CREATING a new one?",26,6,2,&DoSaveb[0],NULL};
void Item_Quit(void)
{
int button;
button=DoDialog(&Qdialog);
if (button==1)
{
TEDInfo->lastvid=videomode;
TEDInfo->level=whichmap;
TEDInfo->OldCgaXMS=0;
TEDInfo->OldEgaXMS=0;
TEDInfo->OldVgaXMS=0;
TEDInfo->OldCgaXMSsize=0;
TEDInfo->OldEgaXMSsize=0;
TEDInfo->OldVgaXMSsize=0;
TEDInfo->pflags=((planeton&1)<<6)|
((planemon&1)<<5)|
((planeion&1)<<4)|
((viewton&1)<<2)|
((viewmon&1)<<1)|
(viewion&1);
SaveTEDInfo();
if (DirtyFlag)
{
button=DoDialog(&DoSaved);
if (button==1)
Item_SaveMap();
if (!button)
return; // ESC exits
}
SaveOutputHeader();
Quit("");
}
}
////////////////////////////////////////////////////
//
// Item - Edit Map Names
//
////////////////////////////////////////////////////
char EMNstring[16];
btype EMNb[]={{EMNstring,1,4,1},
{" ",1,8,1},
{" Exit ",7,11,1}};
DialogDef EMNd={" MAP RENAME\n\nChange...\n\n\n\nTo..."
,20,13,3,&EMNb[0],NULL};
void Item_EditMapNames(void)
{
int which,mapnum,redraw=0,omapnum,oxb,oyb;
MapHeaderStr TempHeader;
char temp[16];
CheckForMapSave();
omapnum=whichmap;
oxb=xbase;
oyb=ybase;
if ((mapnum=SelectMap(1,CREATED,"TO RENAME"))<0)
return;
whichmap=mapnum;
LoadMap(whichmap);
strcpy(EMNstring,MapHeader.name);
MouseHide();
DrawDialog(&EMNd,1);
GetDialogXY(&EMNd,&sx,&sy);
MouseShow();
which=2;
#pragma warn -rch
goto badboy;
do
{
which=CheckButtons(&EMNd);
badboy:
#pragma warn +rch
switch(which)
{
case 1:
RestoreBackground();
if ((mapnum=SelectMap(1,CREATED,"TO RENAME"))<0)
{
if (redraw)
DrawInfoBar();
whichmap=omapnum;
LoadMap(whichmap);
xbase=oxb;
ybase=oyb;
return;
}
whichmap=mapnum;
LoadMap(whichmap);
strcpy(EMNstring,MapHeader.name);
MouseHide();
DrawDialog(&EMNd,1);
MouseShow();
case 2:
MouseHide();
GetButtonXY(&EMNd,1,&sx,&sy);
print(EMNb[1].text);
GetButtonXY(&EMNd,1,&sx,&sy);
if (input(temp,15))
{
writeH=1;
strcpy(MapHeader.name,temp);
strcpy(MapNames[mapnum],temp);
DirtyFlag=1;
Item_SaveMap();
}
else
{
GetButtonXY(&EMNd,1,&sx,&sy);
print(EMNb[1].text);
}
MouseShow();
break;
case 3:
which=0;
}
} while(which);
RestoreBackground();
if (redraw)
DrawInfoBar();
whichmap=omapnum;
LoadMap(whichmap);
xbase=oxb;
ybase=oyb;
}
////////////////////////////////////////////////////
//
// Item - Paste Mode
//
////////////////////////////////////////////////////
void Item_Paste(void)
{
if (!TileCopy.w)
return;
ZeroModes();
PasteMode=1;
DrawInfoBar();
px=(pixelx>>(tsize+2))+xbase;
py=((pixely-8)>>(tsize+2))+ybase;
}
////////////////////////////////////////////////////
//
// Item - Copy Mode
//
////////////////////////////////////////////////////
void Item_Copy(void)
{
ZeroModes();
SelectMode=1;
SelX1=SelY1=SelX2=SelY2=-1;
DrawInfoBar();
}
////////////////////////////////////////////////////
//
// Item - LastVideo
//
////////////////////////////////////////////////////
void Item_LastVideo(void)
{
int temp=videomode;
videomode=lastvideo;
lastvideo=temp;
if (temp==EGA1)
videomode=EGA2;
else
videomode=EGA1;
switch(videomode)
{
case CGA:
xmshandle=CgaXMS;
XMSlookup=CgaXMSlookup;
break;
case EGA1:
case EGA2:
xmshandle=EgaXMS;
XMSlookup=EgaXMSlookup;
break;
case VGA:
xmshandle=VgaXMS;
XMSlookup=VgaXMSlookup;
}
MouseHide();
setvideo(videomode);
InitDesktop(TED5MenuBar,0);
DrawInfoBar();
FigureScreenEdges();
if (xbase+screenw>mapwidth)
xbase=mapwidth-screenw;
if (mapwidth<screenw)
xbase=0;
if (ybase+screenh>mapheight)
ybase=mapheight-screenh;
if (mapheight<screenh)
ybase=0;
DrawMap();
MouseShow();
}
////////////////////////////////////////////////////
//
// Item - Switch to the Last Map
//
////////////////////////////////////////////////////
void Item_LastMap(void)
{
int temp;
if (!CheckForMapSave())
return;
if (lastmap==-1)
{
int which=SelectMap(1,CREATED,"TO EDIT");
if (which==-1)
return;
lastmap=which;
}
temp=whichmap;
whichmap=lastmap;
lastmap=temp;
LoadMap(whichmap);
InitDesktop(TED5MenuBar,0);
MouseShow();
DrawMap();
DrawInfoBar();
}
////////////////////////////////////////////////////
//
// Item - Flood Fill!
//
////////////////////////////////////////////////////
void Item_FloodFill(void)
{
ZeroModes();
FillMode=1;
DrawInfoBar();
}
void DoFloodFill(int x,int y,int whichb)
{
#define NUMSPORES 500
int obx[NUMSPORES],oby[NUMSPORES],i,used,j,width,k,highest,height,
vectx[4]={0,1,0,-1},vecty[4]={-1,0,1,0},orgt,orgm,orgi,Ton,Mon,Ion;
unsigned ptr,newoff,whichplanes=0,ctrl=0;
int nx,ny,newt,newm,newi;
if (keydown[0x1d] || whichb)
ctrl++;
whichplanes=planeton+planemon+planeion;
if (whichplanes>1)
{
ErrDialog("I will only allow Flood Filling\n"
"one plane at a time; you have\n"
"more than one plane selected."," OK ");
return;
}
for (i=0;i<NUMSPORES;i++)
obx[i]=oby[i]=-1;
obx[0]=x;
oby[0]=y;
newoff=ptr=oby[0]*mapwidth+obx[0];
width=MapHeader.width;
height=MapHeader.height;
used=1;
highest=1;
if (obx[0]<0 || oby[0]<0 || obx[0]>width || oby[0]>height)
{
FillMode=0;
DrawInfoBar();
return;
}
Ton=planeton;
Mon=planemon;
Ion=planeion;
orgt=*(MapBkgnd+ptr);
orgm=*(MapFrgnd+ptr);
orgi=*(MapInfoPl+ptr);
if (((Ton?whicht==orgt:0) ||
(Mon?whichtm-tilenum==orgm:0) ||
(Ion?whichi-tilenum==orgi:0)) && !ctrl)
{
FillMode=0;
DrawInfoBar();
return;
}
MouseHide();
CopyUndoRegion();
UndoRegion.x=UndoRegion.y=0;
UndoRegion.w=mapwidth;
UndoRegion.h=mapheight;
if (ctrl)
{
unsigned from=(TileCopy.y+(y%TileCopy.h))*mapwidth+
TileCopy.x+(x%TileCopy.w);
switch(TileCopy.MapOrTileSelect)
{
case 0: // COPY BUFFER
Ton=TileCopy.PlanesCopied&BPLANE;
Mon=TileCopy.PlanesCopied&FPLANE;
Ion=TileCopy.PlanesCopied&IPLANE;
newt=CutBkgnd[from];
newm=CutFrgnd[from];
newi=CutInfoPl[from];
break;
case 1: // TILES
Ton=1;
Mon=Ion=0;
newt=((y%TileCopy.h)+TileCopy.y)*selectcols+
TileCopy.x+(x%TileCopy.w);
if (XMSlookup[newt]<0)
Ton=0;
break;
case 2: // MASKED
Ton=Ion=0;
Mon=1;
newm=((y%TileCopy.h)+TileCopy.y)*selectcols+
TileCopy.x+(x%TileCopy.w)+tilenum+maxiconrows*selectcols;
if (XMSlookup[newm]<0)
Mon=0;
else
newm-=tilenum;
}
}
else
{
newt=whicht;
newm=whichtm-tilenum;
newi=whichi-tilenum;
}
if (Ton)
*(MapBkgnd+newoff)=newt;
if (Mon)
*(MapFrgnd+newoff)=newm;
if (Ion)
*(MapInfoPl+newoff)=newi;
do
{
for (i=0;i<=highest;i++)
//
// SEE IF SPORE EXISTS
//
if (obx[i]!=-1)
{
//
// DRAW TILE AT SPORE IF IT'S ONSCREEN
//
if (oby[i]>=ybase && oby[i]<ybase+screenh &&
obx[i]>=xbase && obx[i]<xbase+screenw)
{
unsigned oldt,oldm,oldi,off;
off=oby[i]*width+obx[i];
oldt=*(MapBkgnd+off);
oldm=*(MapFrgnd+off)+tilenum;
oldi=*(MapInfoPl+off)+tilenum;
CombineTiles(viewton?oldt:-BkgndColor,
viewmon?oldm:0,
viewion?oldi:0,
tsize);
DrawTile((obx[i]-xbase)<<(tsize-1),((oby[i]-ybase)<<(tsize+2))+8,tsize);
}
//
// FREE THIS SPORE
//
x=obx[i];
y=oby[i];
obx[i]=-1;
used--;
//
// SEARCH 4 QUADRANTS FOR A SPORE TO FILL
// (ONLY 4 QUADS SO WE DON'T FILL THRU DIAGONALS)
//
if (!ctrl)
for (j=0;j<4;j++)
{
newoff=(y+vecty[j])*mapwidth+x+vectx[j];
if ((Ton?*(MapBkgnd+newoff)==orgt:1) &&
(Mon?*(MapFrgnd+newoff)==orgm:1) &&
(Ion?*(MapInfoPl+newoff)==orgi:1))
{
for (k=0;k<NUMSPORES;k++)
if (obx[k]==-1)
{
obx[k]=x+vectx[j];
oby[k]=y+vecty[j];
if (obx[k]<0 || obx[k]>width || oby[k]<0 || oby[k]>height)
{
obx[k]=-1;
break;
}
used++;
if (Ton)
*(MapBkgnd+newoff)=whicht;
if (Mon)
*(MapFrgnd+newoff)=whichtm-tilenum;
if (Ion)
*(MapInfoPl+newoff)=whichi-tilenum;
DirtyFlag=1;
if (k>highest)
highest=k;
break;
}
}
if (keydown[1]) // ESC OUT
{
while(keydown[1]);
goto done;
}
}
else
for (j=0;j<4;j++)
{
unsigned from;
ny=y+vecty[j];
nx=x+vectx[j];
newoff=ny*mapwidth+nx;
if ((Ton?*(MapBkgnd+newoff)==orgt:1) &&
(Mon?*(MapFrgnd+newoff)==orgm:1) &&
(Ion?*(MapInfoPl+newoff)==orgi:1))
{
for (k=0;k<NUMSPORES;k++)
if (obx[k]==-1)
{
obx[k]=nx;
oby[k]=ny;
if (obx[k]<0 || obx[k]>width || oby[k]<0 || oby[k]>height)
{
obx[k]=-1;
break;
}
from=(TileCopy.y+(ny%TileCopy.h))*mapwidth+
TileCopy.x+(nx%TileCopy.w);
switch(TileCopy.MapOrTileSelect)
{
case 0: // COPY BUFFER
Ton=TileCopy.PlanesCopied&BPLANE;
Mon=TileCopy.PlanesCopied&FPLANE;
Ion=TileCopy.PlanesCopied&IPLANE;
newt=CutBkgnd[from];
newm=CutFrgnd[from];
newi=CutInfoPl[from];
break;
case 1: // TILES
Ton=1;
Mon=Ion=0;
newt=((ny%TileCopy.h)+TileCopy.y)*selectcols+
TileCopy.x+(nx%TileCopy.w);
if (XMSlookup[newt]<0)
Ton=0;
break;
case 2: // MASKED
Ton=Ion=0;
Mon=1;
newm=((ny%TileCopy.h)+TileCopy.y)*selectcols+
TileCopy.x+(nx%TileCopy.w)+tilenum+maxiconrows*selectcols;
if (XMSlookup[newm]<0)
Mon=0;
else
newm-=tilenum;
}
if (Ton)
*(MapBkgnd+newoff)=newt;
if (Mon)
*(MapFrgnd+newoff)=newm;
if (Ion)
*(MapInfoPl+newoff)=newi;
used++;
DirtyFlag=1;
if (k>highest)
highest=k;
break;
}
}
if (keydown[1]) // ESC OUT
{
while(keydown[1]);
goto done;
}
}
}
} while(used);
done:
DrawMap();
MouseShow();
FillMode=0;
DrawInfoBar();
}
////////////////////////////////////////////////////
//
// If map has been changed, ask user if they want
// to SAVE it before continuing.
//
////////////////////////////////////////////////////
btype oktosaveB[]={{" Yes ",10,2,2},{" No ",20,2,1}};
DialogDef oktosaveD={"The map has been modified!\n"
"Save it?",26,4,2,&oktosaveB[0],NULL};
int CheckForMapSave(void)
{
if (DirtyFlag)
{
int which=DoDialog(&oktosaveD);
if (!which)
return 0;
if (which==1)
Item_SaveMap();
}
return 1;
}
////////////////////////////////////////////////////
//
// Zero all special mode flags
//
////////////////////////////////////////////////////
void ZeroModes(void)
{
SelX1=SelX2=SelY1=SelY2=-1;
if (BfillMode || SelectMode || PasteMode || FillMode)
{
DrawMap();
DrawInfoBar();
}
BfillMode=SelectMode=PasteMode=FillMode=0;
}
////////////////////////////////////////////////////
//
// Item - Count Map Tiles
//
////////////////////////////////////////////////////
btype CMTb[]={
{" Exit ",9,20,2},
{" TILE ",1,20,1},
{" MASKED ",17,20,1},
{" Rebuild ",27,20,1}
};
DialogDef CMTd={" Count Unused Map Tiles",38,22,4,&CMTb[0],0};
unsigned char _seg *tarray,_seg *tmarray,thesparse;
void Item_CountTiles(void)
{
enum {TILE,TILEM};
unsigned i,j,dx,dy,max,exit=0,numt,numtm,oxbase,oybase,nsize,nmsize,redraw;
int which,dumrow,dumcol;
char pb,pf,pi;
CheckForMapSave();
oxbase=xbase;
oybase=ybase;
//
// COMPUTE SIZE OF EACH TILE
//
switch(videomode)
{
case CGA: nsize=16; nmsize=32; break;
case EGA1:
case EGA2: nsize=32; nmsize=40; break;
case VGA: nsize=64; nmsize=128;
}
nsize=nsize<<((tsize-1)<<1);
nmsize=nmsize<<((tsize-1)<<1);
MouseHide();
DrawDialog(&CMTd,1);
GetDialogXY(&CMTd,&dx,&dy);
sx=dx+4;
sy=dy+2;
print("Counting tiles in map:");
MouseShow();
MMAllocate((memptr *)&tarray,tilenum);
MMAllocate((memptr *)&tmarray,tilemnum);
_fmemset(tarray,0,tilenum);
_fmemset(tmarray,0,tilemnum);
//
// Now, load each map in & count the tiles
//
pb=MapFileHeader->maptype&BPLANE;
pf=MapFileHeader->maptype&FPLANE;
pi=MapFileHeader->maptype&IPLANE;
for (i=0;i<100;i++)
if (MapFileHeader->dataoffsets[i]>=0)
{
sx=dx+26;
sy=dy+2;
printint(i);
LoadMap(i);
max=mapwidth*mapheight;
for (j=0;j<max;j++)
{
if (pb)
tarray[MapBkgnd[j]]=1;
if (pf)
tmarray[MapFrgnd[j]]=1;
if (pi)
tmarray[MapInfoPl[j]]=1;
}
}
//
// Find a SPARSE tile
//
for (i=0;i<tilenum;i++)
if (XMSlookup[i]<0)
{
thesparse=i;
break;
}
//
// Count unused amount
//
numt=0;
for (i=0;i<tilenum;i++)
if (XMSlookup[i]>=0 && !tarray[i])
numt++;
numtm=0;
for (i=0;i<tilemnum;i++)
if (XMSlookup[i+tilenum]>=0 && !tmarray[i])
numtm++;
//
// INPUT FROM DIALOG
//
do
{
MouseHide();
xormask=0;
sx=dx+2;
sy=dy+17;
print("Unused TILES:");
printint(numt);
print(", unused MASKED:");
printint(numtm);
print(" ");
sx=dx+2;
sy=dy+18;
print("TILE Memory:");
printint((1023l+(long)numt*nsize)/1024);
print("K, MASKED Memory:");
printint((1023l+(long)numtm*nmsize)/1024);
print("K ");
MouseShow();
DrawUnused(0);
redraw=0;
do
{
if (!MouseButton())
which=CheckButtonsRet(&CMTd);
MouseCoords(&pixelx,&pixely);
pixelx/=8;
pixely/=8;
if (MouseButton() && pixelx>dx && pixelx<dx+37 && pixely>dy && pixely<dy+18)
{
int tile=((pixelx-dx-1)>>(tsize-1))+((pixely-dy-1)>>(tsize-1))*(9<<(3-tsize));
switch(whichscreen)
{
case TILES:
if (!tarray[tile+tilebase] && XMSlookup[tile+tilebase]>=0)
{
tarray[tile+tilebase]=1;
numt--;
redraw=1;
}
break;
case MASKED:
if (!tmarray[tile+tilembase] && XMSlookup[tilenum+tile+tilembase]>=0)
{
tmarray[tile+tilembase]=1;
numtm--;
redraw=1;
}
}
continue;
}
switch(which)
{
case 0:
case 1:
exit=1;
continue;
case 2:
MouseHide();
GetButtonXY(&CMTd,which-1,&sx,&sy);
print(CMTb[which-1].text);
whichscreen=TILES;
DrawUnused(0);
MouseShow();
continue;
case 3:
MouseHide();
GetButtonXY(&CMTd,which-1,&sx,&sy);
print(CMTb[which-1].text);
whichscreen=MASKED;
DrawUnused(0);
MouseShow();
continue;
//
// REBUILD GRAPHICS FILE & HEADER
//
case 4:
{
char newgfx[13]="NEW?GA.",
newhead[13]="NEW?HEAD.",
newhobj[13]="NEW?HEAD.",
oldhead[13]="?GAHEAD.";
char _seg *gfxhead;
newgfx[3]=format[0];
newhead[3]=format[0];
newhobj[3]=format[0];
oldhead[0]=format[0];
LoadIn(oldhead,(memptr *)&gfxhead);
for (i=0;i<tilenum;i++)
{
if (tarray[i])
*(gfxhead+i*3)=*(gfxhead+i*3);
}
}
continue;
}
//
// KEY CHECKS
//
if (keydown[1])
{
exit=1;
continue;
}
else
if (keydown[0x50])
DrawUnused(1);
else
if (keydown[0x48])
DrawUnused(-1);
else
if (keydown[0x49])
{
DrawUnused(-8);
while(keydown[0x49]);
}
else
if (keydown[0x51])
{
DrawUnused(8);
while(keydown[0x51]);
}
} while(!redraw && !exit);
} while(!exit);
RestoreBackground();
LoadMap(whichmap);
tilebase=tilembase=0;
xbase=oxbase;
ybase=oybase;
}
//
// FILL THE "UNUSED TILES" SCREEN WITH TILES
//
void DrawUnused(int deltarow)
{
char tile[32*32];
int numcols,numrows,i,j,top;
if (whichscreen==ICONS)
whichscreen=TILES;
MouseHide();
numrows=18-10*(tsize==2)-15*(tsize==3);
left=2;
top=2*8;
if (videomode==EGA2)
{
left=22;
top=20*8;
}
switch(tsize)
{
case 1: numcols=36; break;
case 2: numcols=18; break;
case 3: numcols=9;
}
if (whichscreen==TILES && tilebase+numrows*numcols>tilenum)
{
tilebase=0;
numrows=tilenum/numcols;
}
if (whichscreen==MASKED && tilembase+numrows*numcols>tilemnum)
{
tilembase=0;
numrows=tilemnum/numcols;
}
switch((deltarow<0?-1:deltarow>0?1:0))
{
case -1:
switch(whichscreen)
{
case TILES:
tilebase+=deltarow*numcols;
if (tilebase<0)
tilebase=0;
break;
case MASKED:
tilembase+=deltarow*numcols;
if (tilembase<0)
tilembase=0;
}
break;
case 1:
switch(whichscreen)
{
case TILES:
tilebase+=deltarow*numcols;
if (tilebase+numrows*numcols>tilenum)
tilebase=tilenum-numcols*numrows;
break;
case MASKED:
tilembase+=deltarow*numcols;
if (tilembase+numrows*numcols>tilemnum)
tilembase=tilemnum-numcols*numrows;
}
}
switch(whichscreen)
{
case TILES:
for(j=0;j<numrows;j++)
for(i=0;i<numcols;i++)
{
if (!tarray[tilebase+j*numcols+i] && XMSlookup[tilebase+j*numcols+i]>=0)
CombineTiles(tilebase+j*numcols+i,0,0,tsize);
else
CombineTiles(thesparse,0,0,tsize);
DrawTile(i*2+left,j*16+top,tsize);
}
break;
case MASKED:
for(j=0;j<numrows;j++)
for(i=0;i<numcols;i++)
{
if (!tmarray[tilembase+j*numcols+i] && XMSlookup[tilenum+tilembase+j*numcols+i]>=0)
CombineTiles(-BkgndColor,tilenum+tilembase+j*numcols+i,0,tsize);
else
CombineTiles(thesparse,0,0,tsize);
DrawTile(i*2+left,j*16+top,tsize);
}
}
MouseShow();
}